package manager
{
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.events.MouseEvent;
	import flash.utils.Dictionary;

	import globals.Global;
	import globals.Setting;

	import ui.common.ToolTipWindown;

	import util.DisplayUtil;

	/**
	 * 提示框管理器。
	 * @author luguobin
	 */
	public class TooltipManager
	{
		private static var _instance:TooltipManager;
		private var _components:Dictionary = new Dictionary(); //用于存放组件的引用，该对象是用于静态的tip的。
		private var _myDOdic:Dictionary = new Dictionary(); //存放自定义动态的toolgip的相关信息。
		private var _tooltipWindown:ToolTipWindown;

		public function TooltipManager()
		{
			if(_instance)
			{
				throw new Error("单例不能被实例化.");
			}
		}

		public static function getInstance():TooltipManager
		{
			if(_instance == null)
			{
				_instance = new TooltipManager();
			}
			return _instance;
		}

		private function initTooltipWindown():void
		{
			if(_tooltipWindown == null)
			{
				_tooltipWindown = new ToolTipWindown();
			}
		}

		/**显示带有图片的
		 * @param textStr<String> 要显示tooltip的内容。
		 * @param picData<DisplayObject> 要显示的图片。
		 * @param posX<Number> 图片的位置。
		 * @param posY<Number> 图片的位置。
		 * **/
		public function showTipWithPic(textStr:String, picData:DisplayObject, posX:Number = 0, posY:Number = 0, width:Number = 100, height:Number = 0):void
		{
			initTooltipWindown();

			if(textStr != null && textStr != "")
			{
				_tooltipWindown.showTipWithPic(textStr, picData, posX, posY, width, height);
			}
		}

		/**
		 * 复杂的tooltip显示。
		 * @param target<DisplayObject> 目标元件。
		 * @param tipDialog<DisplayObject> 浮动的tooltip对话框。
		 */
		public function addComplexTooltip(target:DisplayObject, tipDialog:DisplayObject):void
		{
			if(target && tipDialog)
			{
				if(_myDOdic[target] == undefined)
				{
					target.addEventListener(MouseEvent.MOUSE_OVER, showComplexTooltip);
					target.addEventListener(MouseEvent.MOUSE_OUT, closeComplexTooltip);
				}
				_myDOdic[target] = tipDialog;
			}
		}

		private function showComplexTooltip(event:MouseEvent):void
		{
			var tooltipDO:DisplayObject = _myDOdic[event.currentTarget];

			if(Global.stage.mouseX + tooltipDO.width > Setting.STAGE_WIDTH) //判断出右边的边界了.
			{
				if(Global.stage.mouseY + tooltipDO.height > Setting.STAGE_HEIGHT) //判断出下边的边界了.
				{
					tooltipDO.x = Global.stage.mouseX - tooltipDO.width - 2;
				}
				else
				{
					tooltipDO.x = Setting.STAGE_WIDTH - tooltipDO.width - 1;
				}
			}
			else
			{
				tooltipDO.x = Global.stage.mouseX + 2;
			}

			if(Global.stage.mouseY + tooltipDO.height > Setting.STAGE_HEIGHT) //判断出下边的边界了.
			{
				tooltipDO.y = Setting.STAGE_HEIGHT - tooltipDO.height - 1;
			}
			else
			{
				tooltipDO.y = Global.stage.mouseY + 2;
			}
			DisplayUtil.addChild(tooltipDO, Global.game.topLayer);
		}

		private function closeComplexTooltip(event:MouseEvent):void
		{
			var tooltipDO:DisplayObject = _myDOdic[event.currentTarget];
			DisplayUtil.removeChild(Global.game.topLayer, tooltipDO);
		}

		/**
		 * 移除“组件” 已经添加注册的侦听器。
		 * 该方法是对应于使用addComponentTooltip()方法添加的侦听器。
		 * @param target 组件目标。
		 */
		public function removeComplexTooltip(target:DisplayObject):void
		{
			if(target != null && _myDOdic[target] != undefined)
			{
				target.removeEventListener(MouseEvent.MOUSE_OVER, showComplexTooltip);
				target.removeEventListener(MouseEvent.MOUSE_OUT, closeComplexTooltip);
				delete _myDOdic[target];
			}
		}

		/**
		 * 给“组件”添加注册侦听tooltip信息。 此方法有别于addItem()。
		 * 些方法给自定义动态的tooltip，而不是静态的tooltip使用。
		 * @param target 组件目标。
		 * @param tooltipStr 要显示tooltip的内容。
		 * @param isHtml 是否支持Html格式。
		 * @param width tooltip提示框的宽度。
		 * @param title 提示框的标头。
		 */
		public function addComponentTooltip(target:DisplayObject, tooltipStr:String, isHtml:Boolean = false, width:Number = 150, title:String = ""):void
		{
			if(target != null && tooltipStr != "")
			{
				if(_myDOdic[target] == undefined)
				{
					target.addEventListener(MouseEvent.MOUSE_OVER, myComponentOverHandle);
					target.addEventListener(MouseEvent.MOUSE_OUT, ontHandle);
				}
				_myDOdic[target] = {content: tooltipStr, isHtml: isHtml, myWidth: width, tipsTitle: title};
			}
			else if(_myDOdic[target] != undefined && tooltipStr == "")
			{
				removeComponentTooltip(target);
			}
		}

		/**
		 * 显示htmlStr内容的提示框。
		 * @param htmlStr tooltip的内容，html格式的。
		 * @param width 提示框的宽度。
		 * @param height 提示框的高度。默认值为0，表示自动适应高度。
		 * @param numInRow 提示框每行的文字的个数。默认值为0，宽度以width为准,如不为0，宽度以numInRow为准。
		 * @param title<String> 提示的标题。默认居中!
		 * 附：如果想要居左，直接把title的内容添加在htmlStr的前面就可以达到效果了。
		 */
		public function showTipHtml(htmlStr:String, width:Number = 150, height:Number = 0, title:String = '', numInRow:uint = 0):void
		{
			initTooltipWindown();

			if(htmlStr != "" && htmlStr != null)
			{
				_tooltipWindown.showHtml(htmlStr, width, height, numInRow, title);
			}
		}

		/**
		 * 显示tooltip的提示框，自动加宽和高。
		 * @param textStr<String> tooltip信息的内容。
		 * @param width<Number> 设宽度，如果默为0，表示自动适应宽度。
		 */
		public function showTipText(textStr:String, width:Number = 150):void
		{
			initTooltipWindown();
			_tooltipWindown.showText(textStr, width);
		}

		private function myComponentOverHandle(event:MouseEvent):void
		{
			if(_myDOdic[event.currentTarget] != undefined)
			{
				initTooltipWindown();

				if(_myDOdic[event.currentTarget]["isHtml"])
				{
					_tooltipWindown.showHtml(_myDOdic[event.currentTarget]["content"], _myDOdic[event.currentTarget]["myWidth"], 0, 0, _myDOdic[event.currentTarget]["tipsTitle"]);
				}
				else
				{
					_tooltipWindown.showText(_myDOdic[event.currentTarget]["content"], _myDOdic[event.currentTarget]["myWidth"]);
				}
			}
		}

		/**
		 * 移除“组件” 已经添加注册的侦听器。
		 * 该方法是对应于使用addComponentTooltip()方法添加的侦听器。
		 * @param target 组件目标。
		 */
		public function removeComponentTooltip(target:DisplayObject):void
		{
			if(target != null && _myDOdic[target] != undefined)
			{
				target.removeEventListener(MouseEvent.MOUSE_OVER, myComponentOverHandle);
				target.removeEventListener(MouseEvent.MOUSE_OUT, ontHandle);
				delete _myDOdic[target];
			}
		}

		/**关闭提示信息**/
		public function closeTip():void
		{
			if(_tooltipWindown != null)
			{
				_tooltipWindown.close();
			}
		}

		/**
		 * 添加“组件”到显示管理器队列中。静态的tooltip使用此方法。
		 * @param key
		 * @param target
		 */
		public function addItem(key:String, target:DisplayObject):void
		{
			target.addEventListener(MouseEvent.MOUSE_OVER, overHandle);
			target.addEventListener(MouseEvent.MOUSE_OUT, ontHandle);
			_components[key] = target;
		}

		/**移除已经使用addItem()方法注册的侦听器。**/
		public function removeItem(key:String):void
		{
			if(_components[key] != undefined)
			{
				_components[key].addEventListener(MouseEvent.MOUSE_OVER, overHandle);
				_components[key].addEventListener(MouseEvent.MOUSE_OUT, ontHandle);
				delete _components[key];
			}
		}

		/**关闭带有图片的提示框**/
		public function closePicTip():void
		{
			if(_tooltipWindown != null)
			{
				_tooltipWindown.close();
			}
		}

		private function overHandle(event:MouseEvent):void
		{
			var currentTip:Object = null;
			initTooltipWindown();

			for(var key:String in _components)
			{
				if(_components[key] == event.currentTarget)
				{
					//currentTip = UserManager.getInstance().tooltipData[key];//这里是静态tip信息

					if(currentTip != null && currentTip["content"] != "")
					{
						_tooltipWindown.showHtml(currentTip["content"], 150, currentTip["height"], currentTip["numInRow"]);
					}
					break;
				}
			}
		}

		/**关闭**/
		private function ontHandle(event:MouseEvent):void
		{
			_tooltipWindown.close();
		}
	}
}